package behavioralpattern.observerpattern.subject;
/**
 * 邢帅教育
 * <p>
 * 本源代码由数据中心及其作者共同所有，未经版权持有者的事先书面授权，
 * 不得使用、复制、修改、合并、发布、分发和/或销售本源代码的副本。
 *
 * @copyright Copyright (c) 2018. xsteach.com all rights reserved.
 */

import behavioralpattern.observerpattern.NullObserverException;
import behavioralpattern.observerpattern.observer.Observer;
import lombok.Getter;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @author maikec
 * @date 2018/9/14
 */
public abstract class Subject {
    private Set<Observer> observeres;

    public Subject() {
        observeres = new LinkedHashSet<Observer>(  );
    }

    public void attach(Observer observer) {
        observeres.add( observer );
    }

    public void detach(Observer observer) {
        observeres.remove( observer );
    }

    /**
     * 通知观察者
     */
    protected void publish() {
       if (observeres.size() < 1) {
           throw new NullObserverException(  );
       }
       observeres.forEach( observer -> observer.update( this.msg() ) );
    }

    /**
     * 通知信息
     * @return
     */
    protected abstract int msg();
}
